/*******************************************************************************
 *	                           swiic port.c
 *******************************************************************************/
#include "bsp.h"
#include "pincfg.h"
#include "swiic.h"

/*******************************************************************************
 * @brief  sda and scl interface
 *******************************************************************************/
#define SDA_OUT1() sda.en()
#define SDA_OUT0() sda.dis()
#define SDA_ST() sda.in_st()
#define SCL_OUT1() scl.en()
#define SCL_OUT0() scl.dis()

#define IIC_SCL_OUT() scl.dir_out_pp()
#define IIC_SDA_OUT() sda.dir_out_pp()
#define IIC_SDA_IN() sda.dir_in_up()

/*******************************************************************************
 * @brief  fun
 *******************************************************************************/
static void iic_sda_out_high(void);
static void iic_sda_out_low(void);
static void iic_scl_out_high(void);
static void iic_scl_out_low(void);
static void iic_scl_out_mode(void);
static void iic_sda_out_mode(void);
static void iic_sda_in_mode(void);
static uint8_t iic_sda_st_get(void);

void bsp_iic_send_only(char *dat, char len);

/*******************************************************************************
 * @brief  set sda to high level
 * \param[in] none
 * \retval: none
 *******************************************************************************/
static void iic_sda_out_high(void)
{
	SDA_OUT1();
}

/*******************************************************************************
 * @brief  set sda to low level
 * \param[in] none
 * \retval: none
 *******************************************************************************/
static void iic_sda_out_low(void)
{
	SDA_OUT0();
}

/*******************************************************************************
 * @brief  set scl to high level
 * \param[in] none
 * \retval: none
 *******************************************************************************/
static void iic_scl_out_high(void)
{
	SCL_OUT1();
}

/*******************************************************************************
 * @brief  set scl to low level
 * \param[in] none
 * \retval: none
 *******************************************************************************/
static void iic_scl_out_low(void)
{
	SCL_OUT0();
}

/*******************************************************************************
 * @brief  set scl to output mode
 * \param[in] none
 * \retval: none
 *******************************************************************************/
static void iic_scl_out_mode(void)
{
	IIC_SCL_OUT();
}

/*******************************************************************************
 * @brief  set sda to output mode
 * \param[in] none
 * \retval: none
 *******************************************************************************/
static void iic_sda_out_mode(void)
{
	IIC_SDA_OUT();
}

/*******************************************************************************
 * @brief  set sda to input mode
 * \param[in] none
 * \retval: none
 *******************************************************************************/
static void iic_sda_in_mode(void)
{
	IIC_SDA_IN();
}

/*******************************************************************************
 * @brief  get sda st
 * \param[in] none
 * \retval: sda st
 *******************************************************************************/
static uint8_t iic_sda_st_get(void)
{
	return SDA_ST();
}

/*******************************************************************************
 * @brief  software iic config
 *******************************************************************************/
swiic_cfg_type bsp_sw_iic =
	{
		iic_sda_out_high,
		iic_sda_out_low,
		iic_scl_out_high,
		iic_scl_out_low,
		iic_scl_out_mode,
		iic_sda_out_mode,
		iic_sda_in_mode,
		iic_sda_st_get,
};

/*******************************************************************************
 * @brief  bsp iic shend no ack
 * \param[in] dat data pointer
 * \param[in] len data length
 * \retval: none
 *******************************************************************************/
void bsp_iic_send_only(char *dat, char len)
{
	sw_iic_start(&bsp_sw_iic);

	while (len--)
	{
		sw_iic_send_byte(&bsp_sw_iic, *dat++);
	}
	sw_iic_stop(&bsp_sw_iic);
}

/*******************************************************************************
 *                                   EOF
 *******************************************************************************/
